package com.atguigu.java;

/**
 * @author shkstart
 * @create 2022-08-04-17:40
 */
public class HomeWork {

    public static void main(String[] args) {
//        System.out.println(frogJump(5));
//        System.out.println(add(1234));
//        print(1234);
//        printdao(1357);
//        System.out.println(sum(3));
    }

    //    1.青蛙跳台阶
//    一只青蛙一次可以跳上1级台阶，也可以跳上两级
//    求青蛙跳上一个n阶台阶有几种跳法
    public static int frogJump(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        return frogJump(n - 1) + frogJump(n - 2);
    }

    //    2.写一个递归方法，输入一个非负整数，返回支持他的数字之和1234 1+2+3+4
    public static int add(int num) {

        if (num < 10) {
            return num;
        }
        return num % 10 + add(num / 10);


    }

    //    3.按顺序打印一个每一个数字的每一位1234  1 2 3 4
    public static void print(int num) {

//        此时不知道num有多少位，先找到最高位
        if (num > 10) {
            print(num / 10);
        }
//        此时到达最高位， %10是为了保留此高位
        System.out.println(num % 10);
    }

    //    4.按倒序打印一个每一个数字的每一位1234  4 3 2 1
    public static void printdao(int num) {

//        只有个位
        if (num < 10) {
            System.out.println(num % 10);
            return;
        }
//        num不知道有几位，只知道个位
        System.out.println(num % 10);

        printdao(num / 10);


    }

//    5.递归求1+2+3+...+n

    public static int sum(int num) {
        if (num == 1) {

            return 1;
        }
//        只知道当前的num是多少，不知道1..n-1的累加值
        return sum(num - 1) + num;
    }

    /**
     * 汉诺塔问题，此时 讲A上的n个盘子，依次放到c上
     *
     * @param nDisks
     * @param A      起始位置
     * @param B      辅助塔
     * @param C      目标位置
     */
//    6.汉诺塔
    public static void hanoiTower(int nDisks, char A, char B, char C) {

//        盘子数为1
        if(nDisks == 1){
            move(1,A,C);
            return;
        }
//        将n-1个盘子从A到B
        hanoiTower(nDisks-1,A,C,B);
//        此时只剩下最大的盘子
        move(nDisks,A,C);
//        将B上的n-1个盘子依次从B——>C
        hanoiTower(nDisks,B,A,C);
    }

    /**
     * 将编号为N的盘子从sourceTower到distTower
     *
     * @param n
     * @param sourceTower
     * @param distTower
     */
    public static void move(int n, char sourceTower, char distTower) {

        System.out.println("将标号为" + n + "的盘子从" + sourceTower + "->" + distTower);

    }

}